package com.sunshine.scw.base.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.criterion.Criterion;

import com.sunshine.scw.base.dao.query.QueryUtil;



/**
 * 泛型DAO
 * 
 * @author xiao
 * @version 1.2
 * @param <T>
 *            泛型
 * @param <ID>
 *            ID
 */
public interface GenericDao<T, ID extends Serializable> {

	/**
	 * 通过ID来得到实体对象
	 */
	T findById(ID id);

	/**
	 * 保存实体对象
	 */
	Serializable save(T entity);

	/**
	 * 更新或保存实体对象
	 */
	void saveOrUpdate(T entity);

	/**
	 * 更新实体信息
	 */
	void update(T entity);

	/**
	 * 删除实体信息
	 */
	void delete(T entity);

	/**
	 * 根据ID删除实体信息
	 */
	void deleteById(ID id);

	/**
	 * 得到所有记录的行数
	 */
	Integer getRowCount();

	/**
	 * 删除实体集合
	 */
	void removeAll(Collection<T> entities);

	/**
	 * 按照页码和每页的大小分页并返回分页工具类
	 */
	Pagination<T> findPaginationInfo(int pageNo, int pageSize);

	/**
	 * 根据查询工具类组装数据并返回分页工具类
	 */
	Pagination<T> findPaginationInfo(QueryUtil<T> queryUtil);

	/**
	 * 根据查询工具类查询信息列表
	 */
	List findAll(QueryUtil<T> queryUtil);

	/**
	 * 查询所有的信息
	 */
	List findAll();

	/**
	 * 根据约束条件查询
	 */
	List findByCriteria(final Criterion... criterion);

	/**
	 * 统计方法
	 */
	int statistics(Criterion... ctons);

	/**
	 * 统计方法
	 */
	int statistics(List<Criterion> ctons);
}
